# keyboard_control.py
'''
    用于模拟按键输入DCS
'''
import pydirectinput
import time
import pygetwindow as gw
import keyboard

# 小键盘加号和减号的扫描码
NUMPAD_PLUS_SCAN_CODE = 78
NUMPAD_MINUS_SCAN_CODE = 74

pause = 0XC5


def activate_dcs_window():
    dcs_window_title = "Digital Combat Simulator"  # 请确保标题正确
    windows = gw.getWindowsWithTitle(dcs_window_title)
    if not windows:
        raise Exception(f"未找到 DCS World 窗口！已查找的标题: {dcs_window_title}")
    dcs_window = windows[0]
    for _ in range(3):  # 重试3次
        try:
            dcs_window.activate()
            time.sleep(3)  # 等待激活生效  增加延长时间，保证窗口尽可能被激活
            if dcs_window.isActive:
                print(f"窗口已激活: {dcs_window.isActive}")
                return
        except Exception as e:
            print(f"激活窗口失败: {e}")
    raise Exception("无法激活 DCS World 窗口")

def simulate_key_press(key, duration=0.1):
    """
    模拟单一按键的按下和释放。

    :param key: 按键名称（例如 'pageup', 'up' 等）
    :param duration: 按键持续时间（秒）
    """
    pydirectinput.keyDown(key)
    time.sleep(duration)
    pydirectinput.keyUp(key)


def simulate_combo_press(keys, duration=0.1):
    """
    模拟组合键的按下和释放。

    :param keys: 组合键列表，例如 ['ctrlleft', 'f']
    :param duration: 按键持续时间（秒）
    """
    pydirectinput.keyDown(keys[0])  # 先按下第一个键（如Ctrl）
    pydirectinput.keyDown(keys[1])  # 再按下第二个键（如F）
    time.sleep(duration)  # 持续一段时间
    pydirectinput.keyUp(keys[1])  # 先释放第二个键
    pydirectinput.keyUp(keys[0])  # 再释放第一个键


def simulate_combo3_press(keys, duration=0.1):
    """
    模拟组合键的按下和释放。

    复活飞机到初始位置

    :param keys: 组合键列表，例如 ['ctrlright', 'shiftright','tab']
    :param duration: 按键持续时间（秒）
    """
    pydirectinput.keyDown(keys[0])  # 先按下第一个键（如ctrlright）
    pydirectinput.keyDown(keys[1])  # 再按下第二个键（如shiftright）
    pydirectinput.keyDown(keys[2])  # 再按下第二个键（如tab）
    time.sleep(duration)  # 持续一段时间
    pydirectinput.keyDown(keys[2])  # 再按下第二个键（如F）
    pydirectinput.keyUp(keys[1])  # 先释放第二个键
    pydirectinput.keyUp(keys[0])  # 再释放第一个键


def simulate_minkey_press(scan_code, duration=0.1):
    """
    模拟按键按下和释放（使用扫描码）。

    :param scan_code: 按键的扫描码
    :param duration: 按键持续时间（秒）
    """
    keyboard.press(scan_code)
    time.sleep(duration)
    keyboard.release(scan_code)



def throttle_up(duration=0.1):
    """
    油门增加，使用小键盘+键。

    :param duration: 按键持续时间（秒）
    """
    simulate_minkey_press(NUMPAD_PLUS_SCAN_CODE, duration)
    print("油门增加")


def throttle_down(duration=0.1):
    """
    油门减少，使用小键盘-键。

    :param duration: 按键持续时间（秒）
    """
    simulate_minkey_press(NUMPAD_MINUS_SCAN_CODE, duration)
    print("油门减少")


# def pitch_up(duration=0.1):
#     """
#     操作杆上（俯仰），使用上方向键。
#
#     :param duration: 按键持续时间（秒）
#     """
#     simulate_key_press('up', duration)
#     print("操作杆前推-->机头朝下")
#
#
# def pitch_down(duration=0.1):
#     """
#     操作杆下（俯仰），使用下方向键。
#
#     :param duration: 按键持续时间（秒）
#     """
#     simulate_key_press('down', duration)
#     print("操作杆后拉-->机头朝上")
#
#
# def roll_left(duration=0.1):
#     """
#     操作杆左（滚转），使用左方向键。
#
#     :param duration: 按键持续时间（秒）
#     """
#     simulate_key_press('left', duration)
#     print("操作杆左-->向左滚转")
#
#
# def roll_right(duration=0.1):
#     """
#     操作杆右（滚转），使用右方向键。
#
#     :param duration: 按键持续时间（秒）
#     """
#     simulate_key_press('right', duration)
#     print("操作杆右-->向右滚转")
#

def flaps_control(duration=0.1):
    """
    襟翼控制  起飞 巡航使用

    :param duration: 按键持续时间（秒）
    """
    # simulate_combo_press(['shiftleft', 'f'], duration)
    # simulate_key_press('f', duration)  # SU-25T 打开，关闭襟翼
    print("起飞、巡航襟翼控制")

def flapsland_control(duration=0.1):
    """
    襟翼控制  降落使用

    :param duration: 按键持续时间（秒）
    """
    # simulate_combo_press(['shiftleft', 'f'], duration)
    # simulate_key_press('f', duration)  # SU-25T 打开，关闭襟翼
    print("着陆位襟翼打开")

def airbrake_on_control(duration=0.1):
    """
    扰流板打开

    :param duration: 按键持续时间（秒）
    """
    simulate_combo_press(['shiftleft', 'b'], duration)
    # simulate_key_press('b', duration)
    print("控制扰流板")


def airbrake_off_control(duration=0.1):
    """
    扰流板关闭

    :param duration: 按键持续时间（秒）
    """
    simulate_combo_press(['ctrlleft', 'b'], duration)
    # simulate_key_press('b', duration)
    print("控制扰流板")


def gearsoff_control(duration=0.1):
    """
    起落架收起控制   起飞使用

    :param duration: 按键持续时间（秒）
    """
    # simulate_key_press('g', duration)  # SU-25T起落架控制
    simulate_combo_press(['ctrlleft', 'g'], duration)
    print("起落架收起")

def gearson_control(duration=0.1):
    """
    起落架打开控制   降落使用

    :param duration: 按键持续时间（秒）
    """
    # simulate_key_press('g', duration)  # SU-25T起落架控制
    simulate_combo_press(['shiftleft', 'g'], duration)
    print("起落架收起")

# 需要增加机轮刹车
def wheel_control(duration=0.1):
    """
    机轮控制    降落使用

    :param duration: 按键持续时间（秒）
    """
    simulate_key_press('w', duration)  # SU-25T起落架控制
    print("机轮控制")


# 脚舵在起飞和降落时用于在跑道上调整方向
def foot_left(duration=0.1):
    """
    脚舵左，使用Z方向键。

    :param duration: 按键持续时间（秒）
    """
    simulate_key_press('z', duration)
    print("脚舵向左")


def foot_right(duration=0.1):
    """
    脚舵右，使用X方向键。

    :param duration: 按键持续时间（秒）
    """
    simulate_key_press('x', duration)
    print("脚舵向右")


def revive_control(duration=0.1):
    '''
        飞机坠机后进行初始化
    :param duration: 按键持续时间
    :return:
    '''
    simulate_combo3_press(['ctrlright','shiftright', 'tab'], duration)
    print("飞机已复活")

def reset_game(duration=0.1):

    '''
    进行游戏任务环境的重置
    :param duration:  按键持续时间
    :return:
    '''
    simulate_combo_press(['shiftleft', 'r'], duration)
    print("游戏任务环境已重置")

def start_game(duration=0.1):
    '''

    :param duration:
    :return:
    '''
    simulate_minkey_press(pause, duration)
    # simulate_combo_press(['Fn', 'b'], duration)
    print("游戏任务环境已开始")
# 新增 调整航向
# def heading_control(target_heading, current_heading):
#     """根据目标航向调整滚转方向"""
#     error = target_heading - current_heading  # 目标航向 - 实际航向
#     if error > 180:
#         error -= 360
#     elif error < -180:
#         error += 360
#
#     if abs(error) > 5:  # 需要调整航向
#         if error > 0:
#             roll_right(duration=0.1)  # 向右滚转
#         else:
#             roll_left(duration=0.1)  # 向左滚转
#     else:
#         # 保持平飞
#         pass

# 示例用法
# if __name__ == "__main__":
#     activate_dcs_window()  # 激活DCS窗口
#
#     reset_game(duration=0.1)
#     time.sleep(30)
#     start_game(duration=0.3)
#     # flapsland_control(duration=0.3)
#     # revive_control(duration=0.3)
